package cn.tedu.block;

/**
 * @Author 金帮嘉诚
 * @Date 2021-06-10 周四 9:57
 */
/*本类用于测试代码块之间的关系*/
public class TestBlock {
    public static void main(String[] args) {
        //7.创建对象进行测试
        /*1.如果创建了对象，在创建对象之前会先自动执行静态代码块，且此静态代码块只执行一次（不管对象创建几次）
        * 2.每一次创建对象时，都会调用构造代码块与构造方法，构造代码块先执行
        * */
        Person person=new Person();
        person.sleep();
        Person p2=new Person();//再次创建对象，静态代码块也不会再执行，只会执行一次
        /*3.当对象调用方法时，如果方法里有局部代码块，局部代码块才会被执行*/
        p2.sleep();
    }
}
//1.抽象封装形成一个Person类
class Person{
    //2.创建静态代码块
    /*静态代码块：
    * 位置 类里方法外
    * 执行时机 静态代码块也是静态资源，随着类的加载而加载，优先于对象加载
    * 作用 用于专门加载一些需要第一时间加载的资源
    * */
    static {
        System.out.println("我是静态代码块~");
    }
    //3.
    /*构造代码块：
    * 位置 类里方法外
    * 触发时机 创建对象时触发 优先于构造方法执行
    * 作用 用于提取所有构造方法的共性功能
    * */

    {
        System.out.println("我是构造代码块");
    }
    //4.
    /*构造方法是与类同名且没有返回值类型的方法，用于创建对象，再创建对象时触发*/
    public Person() {
        System.out.println("我是构造方法");
    }
    public void sleep(){
        {/*局部代码块
        位置：方法里
        执行时机：调用本方法时触发
        作用：用来控制变量的作用范围，变量的作用范围越小越好
        */
            System.out.println("局部代码块");
        }
    }
}

